import random
import socket
from pydantic import BaseModel
from fastapi import FastAPI, Form, Request, Header
from fastapi.responses import JSONResponse, HTMLResponse, FileResponse, RedirectResponse
from fastapi.templating import Jinja2Templates

# fastapi是一个较新的轻量级Web框架
# 需要安装以下库
# fastapi
# Jinja2
# python-multipart
# uvicorn

import uvicorn
from starlette.staticfiles import StaticFiles

app = FastAPI()

# 网页目录
template = Jinja2Templates(directory="templates")

# 静态资源目录    参数1接口路径    参数2文件目录
# 访问 接口路径 + 文件路径    http://127.0.0.1:8000/static/img/p0.jpg
app.mount("/static", StaticFiles(directory="static"), name="static")


# @app.get @app.post后跟的是接口路径

# 根路径
@app.get("/")
def index():
    return "Hello 王大锤"


@app.get("/get_name")
def get_name():
    return "我叫王大锤"


@app.get("/get_num")
def get_num():
    return 200


# 使用查询参数 QueryParameter
@app.get("/get_data")
def get_data(id, name):
    return {"id": id, "name": name}


# 使用路径参数 PathParameter
@app.get("/get_info/{id}")
def get_info(id):
    return {"id": id}


# 需要客户端传data参数
@app.post("/add_item_data")
def add_item_data(name: str = Form(), price: str = Form()):
    # print(name,price)
    return f"商品名为{name}，价格为{price}"


class Item(BaseModel):
    name: str
    price: str


# 需要客户端传json参数
@app.post("/add_item_json")
def add_item_json(data: Item):
    return f"商品名为{data.name}，价格为{data.price}"


@app.post("/add_my_item")
def add_my_item(data: Item):
    return f"我喜欢的商品是{data.name}，它的价格为{data.price}"

# 定义多种请求方式
# @app.api_route("/my_show", methods=["get", "post"])
# def my_show():
#     return "请求成功"


# 自定义返回json数据 可以添加返回状态码, 响应头等参数
@app.get("/get_json")
def get_json():
    # 返回数据
    dict_data = {"姓名": "王心凌", "喜欢吃": "鸡腿"}
    # 状态码
    status_code = 200
    # 响应头
    headers = {"token": "abcde"}
    return JSONResponse(dict_data, status_code, headers)


# 自定义返回html内容
@app.get("/get_html")
def get_html():
    html_content = """
        <html>
          <body><p style="color:red">Hello World
              <h1>接口测试</h1>
              <p>用户名是王大锤，密码是******</p>
          </p></body>
        </html>
      """
    return HTMLResponse(content=html_content)


# 自定义返回html文件 可以添加返回数据, 状态码, 响应头等参数
@app.get("/get_html_file")
def get_html_file(req: Request):
    num = 99
    list_data = ["王大锤", "王宝强", "王思聪"]
    dict_data = {"name": "王心凌", "age": 20, "sex": "女"}

    # 网页中可使用的数据
    context = {"request": req, "num": num, "list_data": list_data, "dict_data": dict_data}
    # 状态码
    status_code = 200
    # 响应头
    headers = {"token": "abcde"}
    return template.TemplateResponse("index.html", context=context, status_code=status_code, headers=headers)


@app.get("/get_username")
def get_username():
    return "王大锤"


@app.post("/reg")
def reg(username: str = Form(), password: str = Form(), city: str = Form()):
    print(username)
    print(password)
    print(city)

    return username + " 注册成功"

    # 重新定向请求 需要添加状态码302
    # return RedirectResponse("/get_html_file", status_code=302)


# 返回pic
@app.get("/get_pic")
def get_pic():
    return FileResponse("static/img/p0.jpg")


@app.post("/love")
def love(name: str = Form(), hobby: str = Form(), lover: str = Form()):
    instr = f"我叫{name}，爱好是{hobby}，喜欢的人是{lover}，好想去约会"
    print(instr)
    return instr


@app.post("/date")
def date(name: str = Form()):
    return f"我和{name}约会去了"


@app.get("/get_food")
def get_food():
    list_food = ["烤鸭", "螺蛳粉", "火鸡面", "臭豆腐", "草莓蛋糕"]
    # 从列表中随机一个 值
    food = random.choice(list_food)
    return f"我喜欢吃的食物是{food}，我去买去了"


@app.get("/like")
def like():
    list_fruit = ["苹果", "香蕉", "梨", "火龙果", "榴莲", "橘子", "西瓜", "葡萄"]
    # 从列表中随机一个 值
    fruit = random.choice(list_fruit)
    return {"姓名": "王心凌", "想吃": fruit}


@app.post("/buy")
def buy(item: str = Form()):
    return f"我去买{item}去了"


# 启用当前网络ip作为服务器   远程可访问
res = socket.gethostbyname(socket.gethostname())
print(res)
# uvicorn.run(app, host=res, port=8000)

# 启用自访问ip作为服务器     本机访问
uvicorn.run(app, host="127.0.0.1", port=8000)

# 启用所有ip作为服务器       本机访问    远程可访问
# uvicorn.run(app, host="0.0.0.0", port=8000)
